//
//  YXUserAccountViewModel.swift
//  YXweibo
//
//  Created by AS on 5/13/16.
//  Copyright © 2016 AS. All rights reserved.
//

import UIKit
/// 专门处理CZUserAccount的相关操作
class YXUserAccountViewModel: NSObject {

     // 单例
    static let sharedInstance:YXUserAccountViewModel = YXUserAccountViewModel()
    
    // 账号归档和解档的路径
    let userAccountPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last!+"/account.plist"
    /// 账号,全局只要拿到单例就可以访问
    var userAccount:YXUserAccount?
    
    /// 用户是否登录的属性
    var isUserLogin:Bool
    {
        get{
            return userAccount != nil // 账号!=nil就表示登录了
        }
    }
    
    override init() {
        super.init()
        
        // 加载沙盒里面的账号,赋值给userAccount, 只需要加载一次
        userAccount = loadUserAccount()
    }
    
    /// 发送POST请求获取AccessToken
    func loadAccessToken(code:String,callback:(error:NSError?)->())
    {
        // 发送POST请求获取AccessToken
        // 如果urlString里面开头是http或https就直接使用这个urlString,如果不是以http或https开头AFN会帮我们拼接baseURL
        let urlString = "oauth2/access_token"
        
        // 参数
        let parameters = [
            
            "client_id" : client_id,
            "client_secret" : client_secret,
            "grant_type" : "authorization_code",
            "code" : code,
            "redirect_uri": redirect_uri
            
        ]
        // 如果已经授权成功消息在授权的时候不会再看到这个界面,相当于新浪会自动帮我们点击授权按钮,
        // 如果还想自己来授权需要去网站上面取消授权
        YXNetworkTool.sharedInstance.request(RequestMethod.POST, URLString: urlString, parameters: parameters, success: { (task, responseObject)-> Void in
            YXPrint(items: "获取AccessToken成功: \(responseObject)")
            
            // 判断返回的数据是否能够转成字典
            if let result = responseObject as?[String:AnyObject]{
                // 字典转模型
                let userAccount = YXUserAccount(dict:result)
                YXPrint(items: "userAccount: \(userAccount)")
                
                YXPrint(items: "userAccountPath: \(self.userAccountPath)")

                // 调用归档的方法,将模型归档到沙盒里面
                NSKeyedArchiver.archiveRootObject(userAccount, toFile: self.userAccountPath)
                
                // 将账号赋值给属性
                self.userAccount = userAccount
                // 告诉控制器,模型保存完成了
                callback(error: nil)
                
                
            }else
            {
                YXPrint(items: "返回数据转字典失败了")
                
            }
            }, failure: { (task, error) -> Void in
               callback(error: error)
        })
        
    }
    
    // 保存账号到沙盒中
    private func saveUserAccount()
    {
        // 调用归档的方法,将模型归档到沙盒里面
        // 让userAccount对象保存到self.userAccountPath这个路径
        if let account = userAccount {
            NSKeyedArchiver.archiveRootObject(account, toFile: self.userAccountPath)
        }
    }
    // 解档账号
    func loadUserAccount() -> YXUserAccount?{
        // 解档对象
        if let userAccount = NSKeyedUnarchiver.unarchiveObjectWithFile(self.userAccountPath)as? YXUserAccount {
            
            // 加载到了账号, 判断是否过期
            // userAccount.expiresDate 和当前时间比较
            // NSDate(): 当前时间
            // userAccount.expiresDate < NSDate() 过期的
            // 测试:1.改系统时间 2.改userAccount.expiresDate属性,早期的时间
            //            userAccount.expiresDate = NSDate(timeIntervalSinceNow: -1000)

            if userAccount.expiresDate?.compare(NSDate()) !=
            NSComparisonResult.OrderedAscending{
                // 没有过期
                 YXPrint(items: "没有过期")
                return userAccount
            }else
            {
                return nil
            }
        }else
        {
            // 没有加载出账号
            return nil
        }
        
    }
    
    ///加载用户信息
    func loadUserInfo(loadUserInfoCallBack:(error:NSError)->())
    {
       // if let access_token = userAccount?.access_token {
            //            // access_token 有值就走这里
            //
            //            if let uid = userAccount?.uid {
            //                // uid 有值就走这里
            //
            //                // urlString
            //                let urlString = "2/users/show.json"
            //
            //                // 参数
            //                let parameters = [
            //                    "access_token": access_token,
            //                    "uid": uid
            //                ]
            //            }
            //        }
            
            // 可选绑定会造成嵌套层次很多, swift提供了另外一种形式,守卫 guard
            // guard正好相反
            guard let access_token = userAccount?.access_token else
            {
                // 能到里面来说明access_token没有值
                YXPrint(items: "access_token没有值")
                return
            }
             // access_token有值可以在后面继续使用
            guard let uid = userAccount?.uid else
            {
                // 能到这里面来说明uid没有值
                YXPrint(items: "uid没有值")
                return

            }
            
            // uid有值,可以在后面使用uid
            
            // urlString
            let urlString = "2/users/show.json"
            
            // 参数
            let parameters = [
            
                "access_token":access_token,
                "uid":uid
                
            
            ]
            
            // 发送请求
            YXNetworkTool.sharedInstance.request(RequestMethod.GET, URLString: urlString, parameters: parameters, success: { (_, responseObject) in
                if let result = responseObject as?[String:AnyObject] {
                    // 只需要用户的名称和头像地址
                    
                    let screen_name = result["screen_name"] as? String
                    let avatar_large = result["avatar_large"] as? String
                    // 赋值到当前账号的模型中
                    self.userAccount?.screen_name = screen_name
                    self.userAccount?.avatar_large = avatar_large
                    // 将userAccount保存到沙盒中
                    self.saveUserAccount()
                }
                }, failure: { (_, error) in
                   loadUserInfoCallBack(error: error)
            })
    }
}
